package cn.web.web_module.service.impl;

import cn.itcast.mapper.adminMapper;
import cn.itcast.pojo.admin;
import cn.itcast.pojo.role;
import cn.itcast.util.ResponseEntity;
import cn.message.service.IRoleService;
import cn.web.web_module.entity.RoleModule;
import cn.web.web_module.entity.TbAdminRole;
import cn.web.web_module.entity.WebModule;
import cn.web.web_module.mapper.RoleModuleMapper;
import cn.web.web_module.mapper.TbAdminRoleMapper;
import cn.web.web_module.mapper.WebModuleMapper;
import cn.web.web_module.service.RoleModuleService;
import cn.web.web_module.service.WebModuleService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * (WebModule)表服务实现类
 *
 * @author 小松
 * @since 2020-06-19 08:55:58
 */
@Service("webModuleService")
public class WebModuleServiceImpl implements WebModuleService {
    @Resource
    private WebModuleMapper webModuleMapper;

    @Resource
    private IRoleService roleService;

    @Resource
    private RoleModuleService roleModuleService;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private IRoleService iRoleService;

    @Resource
    private TbAdminRoleMapper tbAdminRoleMapper;

    @Resource
    private adminMapper adminMapper;

    @Resource
    private RoleModuleMapper roleModuleMapper;
    /**
     * 通过ID查询单条数据
     *
     * @param moduleId 主键
     * @return 实例对象
     */
    @Override
    public WebModule queryById(Integer moduleId) {
        return this.webModuleMapper.queryById(moduleId);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit 查询条数
     * @return 对象列表
     */
    @Override
    public List<WebModule> queryAllByLimit(int offset, int limit) {
        return this.webModuleMapper.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param webModule 实例对象
     * @return 实例对象
     */
    @Override
    public WebModule insert(WebModule webModule) {
        this.webModuleMapper.insert(webModule);
        if (webModule.getModuleId()>0){ stringRedisTemplate.delete("allModule");}
        return webModule;
    }

    /**
     * 修改数据
     *
     * @param webModule 实例对象
     * @return 实例对象
     */
    @Override
    public WebModule update(WebModule webModule) {
        this.webModuleMapper.update(webModule);
        return this.queryById(webModule.getModuleId());
    }

    /**
     * 通过主键删除数据
     *
     * @param moduleId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer moduleId) {
        return this.webModuleMapper.deleteById(moduleId) > 0;
    }


    /**
     *
     * @Description:
     * 接收一个role信息,返回相应权限的module
     * @auther: 张松
     * @date: 10:07 2020/6/19
     * @param: [role]
     * @return: java.lang.String
     *
     */
    @Override
    public ArrayList<WebModule> getModule(String role) {
        Integer roleId = roleService.getRoleId(role);   //根据角色信息获取角色ID
        ArrayList<Integer> moduleId = roleModuleService.getModuleId(roleId);    //根据角色ID获取对应显示权限的ID
        ArrayList<Integer> childModuleId = webModuleMapper.getChildModuleId(moduleId);  //过滤掉父权限ID
        ArrayList<WebModule> module = webModuleMapper.getModule(childModuleId);  //根据childID获取全部权限Module
        return module;
    }

    /**
     *
     * @Description: 查找全部的角色对应的前端展示权限
     *
     * @auther: 张松
     * @date: 8:40 2020/7/29
     * @param: []
     * @return: cn.itcast.util.ResponseEntity
     *
     */
    @Override
    public Map<String,Object> getAllRoleModule() {
        List<role> roles = iRoleService.getRoles();
        Map<String,Object> map = new HashMap<>();
        for (role role:roles){
            String roleName = role.getRole();
            ArrayList<WebModule> module = getModule(roleName);
            for (WebModule webModule:module){
                webModule.setRole(role);
            }
            map.put(roleName+"",module);
        }
        return map;
    }

    /**
     *
     * @Description: 查找全部的前端显示module
     *
     * @auther: 张松
     * @date: 15:24 2020/7/28
     * @param: []
     * @return: java.util.ArrayList<cn.web.web_module.entity.WebModule>
     *
     */
    @Override
    public List selectAllModule() {
        String allModule = stringRedisTemplate.opsForValue().get("allModule");
        if (StringUtils.isNotBlank(allModule)){
            List<WebModule> webModules = JSONObject.parseArray(allModule, WebModule.class);
            return webModules;
        }
        List<WebModule> webModules = webModuleMapper.selectAllModule();
        ArrayList<Integer> modules = new ArrayList<>();
        webModules.forEach((v)->{
            modules.add(v.getModuleId());
        });
        ArrayList<Integer> childModuleId = webModuleMapper.getChildModuleId(modules);  //过滤掉父权限ID
        ArrayList<WebModule> module = webModuleMapper.getModule(childModuleId);  //根据childID获取全部权限Module
        stringRedisTemplate.opsForValue().set("allModule",JSON.toJSONString(module),60*60*24,TimeUnit.SECONDS);
        return module;
    }

    /**
     *
     * @Description: 删除角色
     *
     * @auther: 张松
     * @date: 11:17 2020/7/29
     * @param: [roleId]
     * @return: cn.itcast.util.ResponseEntity
     *
     */
    @Override
    @Transactional
    public ResponseEntity deleteRole(Integer roleId) {
        List<TbAdminRole> tbAdminRoles = tbAdminRoleMapper.queryRoleFindAdmin(roleId);
        List<admin> deleteAdmin = new ArrayList<>();
        if (!tbAdminRoles.isEmpty()||tbAdminRoles.size()>0){
            for (TbAdminRole tbAdminRole:tbAdminRoles){
                admin admin = adminMapper.selectByPrimaryKey(tbAdminRole.getAdminId());
                deleteAdmin.add(admin);
            }
            return new ResponseEntity(300,"删除失败,请先修改以下管理员角色",deleteAdmin);
        }
        Boolean aBoolean = roleService.deleteRole(roleId);
        int i = roleModuleMapper.deleteRoleModule(roleId);
        return new ResponseEntity(200,"删除成功");
    }

    /**
     *
     * @Description: 修改管理员权限
     *
     * @auther: 张松
     * @date: 18:21 2020/7/29
     * @param: [roleId, moduleId]
     * @return: cn.itcast.util.ResponseEntity
     *
     */
    @Override
    public int updataRoleModule(Integer roleId,ArrayList<Integer> moduleIds) {

        int i = roleModuleMapper.deleteRoleModule(roleId);
        RoleModule roleModule = new RoleModule();
        roleModule.setRoleId(roleId);
        int insert = 0;
        for (Integer moduleId:moduleIds){
            roleModule.setModuleId(moduleId);
            insert = roleModuleMapper.insert(roleModule);
        }
        return insert;
    }


}